#include <stdio.h>
#include <stdlib.h>
#include "matriz.h"
#include "entrada.h"
#include "grafo.h"
#include "atlanticon.h"

FILE* abreArquivo(char* nomeArquivo, char* modo){
    //printf("Abre Arquivo - \n");
    FILE* arqEntrada;
    arqEntrada = fopen(nomeArquivo, modo);
    if (arqEntrada == NULL){
       printf("Arquivo nao encontrado\n");
       exit(0);
    }
    return arqEntrada;
}

void fechaArquivo(FILE* arquivo){
    fclose(arquivo);
}

void processaEntrada(char *argv[]){
    //printf("Processa Entrada - \n");
    FILE* arqEntrada = abreArquivo(argv[1],"r");
    FILE* arqSaida = abreArquivo(argv[2], "w");
    Entrada* nova = novaEntrada(arqEntrada);
    int* cen1;
    int* cen2;
    int* cen3;
    float preju=0;
    int aux;

    for(aux=0;aux<nova->numInstancias;aux++){

    getInstancia(arqEntrada,nova);

    cen1 = cenario1(nova->grafo);

    cen2 = cenario2(nova->grafo);

    cen3 = cenario3(nova->grafo);

    preju = prejuizo(cen1, cen3);

    fprintf(arqSaida,"%d %d %d %.2f\n",cen1[0],cen2[0],cen3[0],preju);

    liberaInstancias(nova);

    }

    //printf("Libera memoria\n");
    free(cen1);
    free(cen2);
    free(cen3);

    //printf("Libera entrada\n");
    liberaEntrada(nova);

    //printf("Fecha arq Saida\n");
    fechaArquivo(arqSaida);

    //printf("Fecha arq Entrada\n");
    fechaArquivo(arqEntrada);

}

void imprimeNumInstanciasArq(FILE* arqSaida, Entrada* entrada){
    //printf("Imprime Num Instancis Arq- \n");
    fprintf(arqSaida,"%d\n",entrada->numInstancias);
}

void imprimeNumInstancias(Entrada* entrada){
    //printf("Imprime Num Instancis - \n");
    printf("%d\n",entrada->numInstancias);
}

int getNumInstancias(FILE* arqEntrada,Entrada* nova){
    //printf("Get Num Instancias - \n");
    int aux;
    fscanf (arqEntrada, "%d", &aux);
    return aux;
}

void getInstancia(FILE* arqEntrada,Entrada* nova){
    //printf("Get Instancia - \n");
    int numVertices = 0;
    int aux, aux1;

    fscanf (arqEntrada, "%d", &numVertices);

    nova->grafo =  (Grafo*) malloc (sizeof(Grafo));

    novoGrafo(nova->grafo, numVertices, numVertices);

    for(aux=0 ; aux<numVertices ; aux++){
        for(aux1=0 ; aux1<numVertices ; aux1++){
            fscanf(arqEntrada, "%d", &nova->grafo->grafo->matriz[aux][aux1]);
        }
    }

    for(aux=0 ; aux<numVertices ; aux++){
        fscanf(arqEntrada, "%d", &nova->grafo->volPedidos[aux]);
    }

    contaArestas(nova->grafo);

}

Entrada* novaEntrada(FILE* entrada){
    //printf("Nova entrada - \n");
    Entrada* nova;
    nova = (Entrada*) malloc (sizeof (Entrada));
    nova->numInstancias = getNumInstancias(entrada, nova);

    return nova;
}

void liberaInstancias(Entrada* entrada){

    liberaGrafo(entrada->grafo);

    free(entrada->grafo);
}

void liberaEntrada(Entrada* entrada){
    //printf("Libera entrada \n");
    free(entrada);
}




